home *** CD-ROM | disk | FTP | other *** search
/ The World of Computer Software / The World of Computer Software.iso / snpd1292.zip / VIO.ASM < prev    next >
Assembly Source File  |  1992-12-26  |  10KB  |  897 lines

  1. ;
  2. ; screen handling primitives
  3. ;
  4. ; by: jim nutt
  5. ;
  6.  
  7. .model large
  8.  
  9. .data
  10.  
  11. vseg    dw      0b000h
  12. vmode   db      ?
  13. x       dw      0
  14. y       dw      0
  15. color   db      07h
  16. ofs     dw      0
  17. xhite   db      8
  18.  
  19. ; video information block
  20.  
  21. VIOinfo struc
  22.     level   db      ?
  23.         db      ?
  24.         dw      ?
  25.     flags   dw      ?
  26.     mode    db      ?
  27.         db      ?
  28.     colors  dw      ?
  29.     pixcol  dw      ?
  30.     pixrow  dw      ?
  31.     txtcol  dw      ?
  32.     txtrow  dw      ?
  33. VIOinfo ends
  34.  
  35. info    VIOinfo <0,0,14,1,0,0,2,0,0,80,25>
  36.  
  37. .code
  38.  
  39. public _VIOopen, _VIOclose, _VIOcolumns, _VIOrows, _VIOmode
  40. public _VIOscrollright, _VIOscrollleft, _VIOscrollup, _VIOscrolldown
  41. public _VIOclear, _VIOputc, _VIOputs, _VIOgetca, _VIOgetra, _VIOheight,
  42. public _VIOsetfore, _VIOsetback, _VIOgetfore, _VIOgetback
  43. public _VIOgotoxy, _VIOupdate, _VIOwherex, _VIOwherey, _VIOputr
  44. public _VIOcursor, _VIOsegment, _VIOsetSegment, _VIOsetRows, _VIOsetCols
  45.  
  46. ;int  _far _pascal VIOheight(void)
  47.  
  48. _VIOheight proc
  49.  
  50.     mov al, xhite;
  51.     xor ah,ah;
  52.     ret
  53.  
  54. _VIOheight endp
  55.  
  56. ;int  _far _pascal VIOopen(void);
  57.  
  58. _VIOopen proc
  59.  
  60.     push ds
  61.  
  62.     mov ax,3000h            ; get dos version, v4 can do this from dos
  63.     int 21h
  64.  
  65.     cmp al,4
  66.     je odos4
  67.  
  68.     mov ax,0f00h            ; get screen mode and width
  69.     int 10h
  70.  
  71.     mov vmode, al
  72.  
  73.     cmp al,7
  74.     je mono
  75.  
  76.     xor al,al
  77.     xchg al,ah
  78.     mov info.txtcol,ax
  79.     mov vseg,0b800h
  80.  
  81.     push di
  82.     mov ax,0fe00h
  83.     mov es,vseg
  84.     mov di,0
  85.     int 10h
  86.     pop di
  87.     mov vseg,es
  88.  
  89.     push bp                 ; how many rows
  90.     mov ax,1130h
  91.     mov bh,1h
  92.     xor dx,dx
  93.     int 10h
  94.     pop bp
  95.  
  96.     cmp dl,0
  97.     je cga
  98.  
  99.     mov xhite,cl
  100.     inc dl
  101.     xor dh,dh
  102.     mov info.txtrow,dx
  103.  
  104. mono:   mov ax,0
  105.     pop ds
  106.     ret
  107.  
  108. odos4:  mov ax,440ch
  109.     mov bx,0
  110.     mov cx,037fh
  111.     mov dx,offset info
  112.     int 21h
  113.     jnc l1
  114.     pop ds
  115.     ret
  116.  
  117. cga:    mov info.txtrow,25
  118.  
  119. l1:     mov ax,0
  120.     pop ds
  121.     ret
  122.  
  123. _VIOopen endp
  124.  
  125. ;void _far _pascal VIOclose(void);
  126.  
  127. _VIOclose proc
  128.  
  129.     mov ax,3000h
  130.     int 21h
  131.  
  132.     cmp al,4
  133.     jne l2
  134.  
  135.     mov ax,440ch
  136.     mov bx,0
  137.     mov cx,035fh
  138.     mov dx,offset info
  139.     int 21h
  140.  
  141. l2:     ret
  142.  
  143. _VIOclose endp
  144.  
  145. ;int  _far VIOcolumns(void);
  146.  
  147. _VIOcolumns proc
  148.  
  149.     mov ax,info.txtcol
  150.     ret
  151.  
  152. _VIOcolumns endp
  153.  
  154. ;int  _far VIOrows(void);
  155.  
  156. _VIOrows proc
  157.  
  158.     mov ax,info.txtrow
  159.     ret
  160.  
  161. _VIOrows endp
  162.  
  163. ;int  _far VIOmode(void);
  164.  
  165. _VIOmode proc
  166.  
  167.     mov al,vmode
  168.     xor ah,ah
  169.     ret
  170.  
  171. _VIOmode endp
  172.  
  173. ;int  _far VIOwherex(void);
  174.  
  175. _VIOwherex proc
  176.  
  177.     mov ax,x
  178.     ret
  179.  
  180. _VIOwherex endp
  181.  
  182. ;int  _far VIOwherey(void);
  183.  
  184. _VIOwherey proc
  185.  
  186.     mov ax,y
  187.     ret
  188.  
  189. _VIOwherey endp
  190.  
  191. ;void _far VIOscrollright(int x1, int y1, int x2, int y2, int count);
  192.  
  193. _VIOscrollright proc
  194.  
  195.     push bp
  196.     mov bp,sp
  197.     pushf
  198.  
  199.     std
  200.  
  201.     push di
  202.     push si
  203.  
  204.     mov ax,[bp+8]
  205.     mov bx,[bp+12]
  206.     sub bx,ax
  207.     mov cx,info.txtcol
  208.     mul cl
  209.     mov dx,[bp+10]
  210.     add dx,ax
  211.     shl dx,1
  212.     mov cx,[bp+10]
  213.     sub cx,[bp+6]
  214.  
  215.     add bx,2
  216.     mov [bp+6],cx
  217.     mov [bp+8],bx
  218.  
  219.     mov es,vseg
  220.  
  221. sr1:    dec word ptr [bp+8]
  222.     jz sr3
  223.     mov bx,[bp+14]
  224.  
  225.     push ds
  226.     mov ah,color
  227.     mov al,20h
  228.  
  229.     push es
  230.     pop ds
  231.  
  232. sr2:    mov di,dx
  233.     mov si,di
  234.     dec si
  235.     dec si
  236.     mov cx,[bp+6]
  237.     rep movsw
  238.     stosw
  239.     dec bx
  240.     jnz sr2
  241.  
  242.     pop ds
  243.     mov ax,info.txtcol
  244.     shl ax,1
  245.     add dx,ax
  246.     jmp sr1
  247.  
  248. sr3:    pop si
  249.     pop di
  250.  
  251.     popf
  252.     pop bp
  253.     ret
  254.  
  255. _VIOscrollright endp
  256.  
  257. ;void _far VIOscrollleft(int x1, int y1, int x2, int y2, int count);
  258.  
  259. _VIOscrollleft proc
  260.  
  261.     push bp
  262.     mov bp,sp
  263.     pushf
  264.  
  265.     push di
  266.     push si
  267.  
  268.     mov ax,[bp+8]
  269.     mov bx,[bp+12]
  270.     sub bx,ax
  271.     mov cx,info.txtcol
  272.     mul cl
  273.     mov dx,[bp+6]
  274.     add dx,ax
  275.     shl dx,1
  276.     mov cx,[bp+10]
  277.     sub cx,[bp+6]
  278.  
  279.     add bx,2
  280.     mov [bp+6],cx
  281.     mov [bp+8],bx
  282.  
  283.     mov es,vseg
  284.  
  285. sl1:    dec word ptr [bp+8]
  286.     jz sl3
  287.     mov bx,[bp+14]
  288.  
  289.     push ds
  290.     mov ah,color
  291.     mov al,20h
  292.  
  293.     push es
  294.     pop ds
  295.  
  296. sl2:    mov di,dx
  297.     mov si,di
  298.     inc si
  299.     inc si
  300.     mov cx,[bp+6]
  301.     rep movsw
  302.     stosw
  303.     dec bx
  304.     jnz sl2
  305.  
  306.     pop ds
  307.     mov ax,info.txtcol
  308.     shl ax,1
  309.     add dx,ax
  310.     jmp sl1
  311.  
  312. sl3:    pop si
  313.     pop di
  314.  
  315.     popf
  316.     pop bp
  317.     ret
  318.  
  319. _VIOscrollleft endp
  320.  
  321. ;void _far VIOscrollup(int x1, int y1, int x2, int y2, int count);
  322.  
  323. _VIOscrollup proc
  324.  
  325.     push bp
  326.     mov bp,sp
  327.     push di
  328.     push si
  329.  
  330.     mov es,vseg
  331.  
  332.     mov bx,[bp+6]
  333.     mov ax,[bp+8]
  334.     mov dx,info.txtcol
  335.     mul dl
  336.     add ax,bx
  337.     shl ax,1
  338.     shl dx,1
  339.  
  340.     push ax
  341.     push ds
  342.     push ax
  343.  
  344.     mov cx,[bp+10]
  345.     sub cx,bx
  346.     mov bx,cx
  347.  
  348.     mov ax,[bp+12]
  349.     sub ax,[bp+8]
  350.     mov [bp+12],ax
  351.  
  352.     push es
  353.     pop ds
  354.     inc word ptr [bp+14]
  355.  
  356. l9:     dec word ptr [bp+14]
  357.     jz l11
  358.     mov ax,[bp+12]
  359.  
  360. l10:    pop di
  361.     mov si,di
  362.     add si,dx
  363.     push si
  364.     mov cx,bx
  365.     rep movsw
  366.     dec ax
  367.     jne l10
  368.  
  369.     pop di
  370.     pop ds
  371.     mov al,20h
  372.     mov ah,color
  373.     mov cx,bx
  374.     rep stosw
  375.  
  376.     pop di
  377.     push di
  378.     push ds
  379.     push di
  380.  
  381.     push es
  382.     pop ds
  383.     jmp l9
  384.  
  385. l11:    pop ax
  386.     pop ds
  387.     pop ax
  388.     pop si
  389.     pop di
  390.  
  391.     pop bp
  392.     ret
  393.  
  394. _VIOscrollup endp
  395.  
  396. ;void _far VIOscrolldown(int x1, int y1, int x2, int y2, int count);
  397.  
  398. _VIOscrolldown proc
  399.  
  400.     push bp
  401.     mov bp,sp
  402.     push di
  403.     push si
  404.  
  405.     mov es,vseg
  406.  
  407.     mov bx,[bp+6]
  408.     mov ax,[bp+12]
  409.     mov dx,info.txtcol
  410.     mul dl
  411.     add ax,bx
  412.     shl ax,1
  413.     shl dx,1
  414.  
  415.     push ax
  416.     push ds
  417.     push ax
  418.  
  419.     mov cx,[bp+10]
  420.     sub cx,bx
  421.     mov bx,cx
  422.  
  423.     mov ax,[bp+12]
  424.     sub ax,[bp+8]
  425.     mov [bp+12],ax
  426.  
  427.     push es
  428.     pop ds
  429.     inc word ptr [bp+14]
  430.  
  431. l6:     dec word ptr [bp+14]
  432.     jz l7
  433.     mov ax,[bp+12]
  434.  
  435. l8:     pop di
  436.     mov si,di
  437.     sub si,dx
  438.     push si
  439.     mov cx,bx
  440.     rep movsw
  441.     dec ax
  442.     jne l8
  443.  
  444.     pop di
  445.     pop ds
  446.     mov al,20h
  447.     mov ah,color
  448.     mov cx,bx
  449.     rep stosw
  450.  
  451.     pop di
  452.     push di
  453.     push ds
  454.     push di
  455.  
  456.     push es
  457.     pop ds
  458.     jmp l6
  459.  
  460. l7:     pop ax
  461.     pop ds
  462.     pop ax
  463.     pop si
  464.     pop di
  465.     pop bp
  466.     ret
  467.  
  468. _VIOscrolldown endp
  469.  
  470. ;void _far VIOclear(int x1, int y1, int x2, int y2);
  471.  
  472. _VIOclear proc
  473.  
  474.     push bp
  475.     mov bp,sp
  476.     push di
  477.     push si
  478.  
  479.     mov es,vseg
  480.  
  481.     mov ax,[bp+8]
  482.     mov bx,[bp+6]
  483.     mov cx,info.txtcol
  484.     mul cl
  485.     add ax,bx
  486.     shl ax,1
  487.     mov si,ax
  488.     mov bx,[bp+10]
  489.     sub bx,[bp+6]
  490.     inc bx
  491.     mov dx,[bp+12]
  492.     sub dx,[bp+8]
  493.     inc dx
  494.     mov al,20h
  495.     mov ah,color
  496.  
  497. l5:     mov di,si
  498.     mov cx,bx
  499.     rep stosw
  500.     mov cx,info.txtcol
  501.     shl cx,1
  502.     add si,cx
  503.     dec dx
  504.     jne l5
  505.  
  506.     pop si
  507.     pop di
  508.     pop bp
  509.     ret
  510.  
  511. _VIOclear endp
  512.  
  513. ;void _far VIOputc(const char c);
  514.  
  515. _VIOputc proc
  516.  
  517.     push bp
  518.     mov bp,sp
  519.     push di
  520.  
  521.     mov es,vseg
  522.     mov di,ofs
  523.  
  524.     mov ax,[bp+6]
  525.     mov ah,color
  526.  
  527.     stosw
  528.  
  529.     mov ofs,di
  530.     pop di
  531.  
  532.     mov ax,x
  533.     inc ax
  534.     cmp ax,info.txtcol
  535.     jge cwrap
  536.  
  537.     mov x,ax
  538.  
  539.     pop bp
  540.     ret
  541.  
  542. cwrap:  inc y
  543.     sub ax,info.txtcol
  544.     mov x,ax
  545.  
  546.     pop bp
  547.     ret
  548.  
  549. _VIOputc endp
  550.  
  551. ;void _far VIOputs(const char far * s);
  552.  
  553. _VIOputs proc
  554.  
  555.     push bp
  556.     mov bp,sp
  557.     push di
  558.         push si
  559.     push ds
  560.  
  561.     mov es,vseg
  562.     mov di,ofs
  563.  
  564.     mov ah,color
  565.     lds si,[bp+6]
  566.     mov bx,x
  567.  
  568. l3:     lodsb
  569.     cmp al,0
  570.     je l4
  571.     stosw
  572.     inc bx
  573.  
  574.     jmp l3
  575.  
  576. l4:     mov ofs,di
  577.     pop ds
  578.         pop si
  579.     pop di
  580.  
  581.     cmp bx,info.txtcol
  582.     jge swrap
  583.  
  584.     mov x,bx
  585.  
  586.     pop bp
  587.     ret
  588.  
  589. swrap:  inc y
  590.     sub bx,info.txtcol
  591.     mov x,bx
  592.  
  593.     pop bp
  594.     ret
  595.  
  596. _VIOputs endp
  597.  
  598. ;int  _far VIOgetca(const int x, const int y);
  599.  
  600. _VIOgetca proc
  601.  
  602.     push bp
  603.     mov bp,sp
  604.  
  605.     mov es,vseg
  606.     mov ax,[bp+8]
  607.     mov bx,[bp+6]
  608.     mov cx,info.txtcol
  609.     mul cl
  610.     add ax,bx
  611.     shl ax,1
  612.  
  613.     xchg ax,bx
  614.     mov ax,es:[bx]
  615.  
  616.     pop bp
  617.     ret
  618.  
  619. _VIOgetca endp
  620.  
  621. ;int *_far VIOgetra(int x1, int y1, int x2, int y2, int * b);
  622.  
  623. _VIOgetra proc
  624.  
  625.     push bp
  626.     mov bp,sp
  627.     push di
  628.     push si
  629.     push ds
  630.  
  631.     mov ax,[bp+8]           ; y1
  632.     mov bx,info.txtcol
  633.     mul bl                  ; y1 * width of screen
  634.     add ax,[bp+6]
  635.     shl ax,1                ; x1 * 2
  636.     shl bx,1                ; width * 2
  637.     mov cx,[bp+10]
  638.     sub cx,[bp+6]           ; x2 - x1
  639.     mov dx,[bp+12]
  640.     sub dx,[bp+8]           ; y2 - y1
  641.     inc dx
  642.     inc cx
  643.     les di,[bp+14]
  644.     mov ds,vseg
  645.     push cx
  646.  
  647. gr1:    pop cx
  648.     push cx
  649.     mov si,ax
  650.     rep movsw
  651.     add ax,bx
  652.     dec dx
  653.     jnz gr1
  654.  
  655.     pop cx
  656.  
  657.     pop ds
  658.     pop si
  659.     pop di
  660.     pop bp
  661.     ret
  662.  
  663. _VIOgetra endp
  664.  
  665. ;void _far VIOputr(int x, int y, int w, int h, int far * b);
  666.  
  667. _VIOputr proc
  668.  
  669.     push bp
  670.     mov bp,sp
  671.  
  672.     push ds
  673.     push si
  674.     push di
  675.  
  676.     mov ax,[bp+8]
  677.     mov bx,info.txtcol
  678.     mul bl                ; y * width
  679.     add ax,[bp+6]
  680.     shl ax,1
  681.     shl bx,1
  682.  
  683.     mov es,vseg
  684.  
  685.     lds si,[bp+14]
  686.     mov dx,[bp+10]
  687.  
  688. pr1:    mov cx,dx
  689.     mov di,ax
  690.     rep movsw
  691.     add ax,bx
  692.     dec word ptr [bp+12]
  693.     jnz pr1
  694.  
  695.     pop di
  696.     pop si
  697.     pop ds
  698.  
  699.     pop bp
  700.     ret
  701.  
  702. _VIOputr endp
  703.  
  704. ;void _far VIOsetfore(const int c);
  705.  
  706. _VIOsetfore proc
  707.  
  708.     push bp
  709.     mov bp,sp
  710.  
  711.     mov bl,color
  712.     and bx,00f0h
  713.     mov ax,[bp+6]
  714.     and ax,000fh
  715.     or  ax,bx
  716.     mov color,al
  717.  
  718.     pop bp
  719.     ret
  720.  
  721. _VIOsetfore endp
  722.  
  723. ;void _far VIOsetback(const int c);
  724.  
  725. _VIOsetback proc
  726.  
  727.     push bp
  728.     mov bp,sp
  729.  
  730.     mov bl,color
  731.     and bx,000fh
  732.     mov ax,[bp+6]
  733.     and ax,000fh
  734.     shl ax,1
  735.     shl ax,1
  736.     shl ax,1
  737.     shl ax,1
  738.     or  ax,bx
  739.     mov color,al
  740.  
  741.     pop bp
  742.     ret
  743.  
  744. _VIOsetback endp
  745.  
  746. ;int  _far VIOgetfore(void);
  747.  
  748. _VIOgetfore proc
  749.  
  750.     mov al,color
  751.     and ax,000fh
  752.     ret
  753.  
  754. _VIOgetfore endp
  755.  
  756. ;int  _far VIOgetback(void);
  757.  
  758. _VIOgetback proc
  759.  
  760.     mov al,color
  761.     and ax,00f0h
  762.     shr al,1
  763.     shr al,1
  764.     shr al,1
  765.     shr al,1
  766.     ret
  767.  
  768. _VIOgetback endp
  769.  
  770. ;void _far VIOgotoxy(int x, int y);
  771.  
  772. _VIOgotoxy proc
  773.  
  774.     push bp
  775.     mov bp,sp
  776.  
  777.     mov bx,[bp + 6]
  778.     mov ax,[bp + 8]
  779.  
  780.     mov x,bx
  781.     mov y,ax
  782.  
  783.     mov cx,info.txtcol
  784.     mul cl
  785.  
  786.     add ax,bx
  787.     shl ax,1
  788.  
  789.     mov ofs,ax
  790.  
  791.     pop bp
  792.     ret
  793.  
  794. _VIOgotoxy endp
  795.  
  796. ;void _far VIOupdate(int x1, int y1, int x2, int y2);
  797.  
  798. _VIOupdate proc
  799.  
  800.     mov ah,2
  801.     mov bh,0
  802.     mov cx,y
  803.     mov dx,x
  804.     mov dh,cl
  805.     int 10h
  806.  
  807.     ret
  808.  
  809. _VIOupdate endp
  810.  
  811. ;void _far VIOcursor(int _far * x, int _far * y, int _far * shape);
  812.  
  813. _VIOcursor proc
  814.  
  815.     push bp
  816.     mov bp,sp
  817.     push ds
  818.  
  819.     mov ah,3
  820.     mov bh,0
  821.     int 10h
  822.  
  823.     mov al,dl
  824.     cbw
  825.     lds bx,[bp + 6]
  826.     mov [bx],ax
  827.  
  828.     mov al,dh
  829.     cbw
  830.     lds bx,[bp + 10]
  831.     mov [bx],ax
  832.  
  833.     lds bx,[bp + 14]
  834.     mov [bx],cx
  835.  
  836.     pop ds
  837.     pop bp
  838.     ret
  839.  
  840. _VIOcursor endp
  841.  
  842. ;unsigned int  _far VIOsegment(void);
  843.  
  844. _VIOsegment proc
  845.  
  846.     mov ax, vseg
  847.     ret
  848.  
  849. _VIOsegment endp
  850.  
  851. ;void _far VIOsetSegment(unsigned int s);
  852.  
  853. _VIOsetSegment proc
  854.  
  855.     push bp
  856.     mov bp,sp
  857.  
  858.     mov ax, [bp + 6]
  859.     mov vseg,ax
  860.  
  861.     pop bp
  862.     ret
  863.  
  864. _VIOsetSegment endp
  865.  
  866. ;void _far VIOsetRows(int r);
  867.  
  868. _VIOsetRows proc
  869.  
  870.     push bp
  871.     mov bp,sp
  872.  
  873.     mov ax,[bp + 6]
  874.     mov info.txtrow,ax
  875.  
  876.     pop bp
  877.     ret
  878.  
  879. _VIOsetRows endp
  880.  
  881. ;void _far VIOsetCols(int c);
  882.  
  883. _VIOsetCols proc
  884.  
  885.     push bp
  886.     mov bp,sp
  887.  
  888.     mov ax,[bp + 6]
  889.     mov info.txtcol, ax
  890.  
  891.     pop bp
  892.     ret
  893.  
  894. _VIOsetCols endp
  895.  
  896. end
  897.